﻿// Cable master POJ - 1064.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <cmath>
#include <stdio.h>
using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-1064

/*
仙境的居民们决定举办一次地区编程比赛。评审委员会已自愿报名，并承诺组织一次最诚实的比赛。
他们决定采用 "星形 "拓扑结构为参赛者连接电脑，即把所有电脑连接到一个中心枢纽。
为了组织一场真正诚实的比赛，评审委员会主席下令将所有参赛选手均匀地安排在集线器周围，与集线器保持相等的距离。
为了购买网线，评审委员会联系了当地一家网络解决方案提供商，要求为他们出售指定数量的等长网线。
评审委员会希望电缆越长越好，以便参赛者之间的距离越远越好。
公司的电缆主管被委派了这项任务。他对库存中每根电缆的长度都了如指掌，只要告诉他必须剪切的长度，他就能精确到一厘米。
然而，这一次他却不知道长度，这让电缆师傅完全摸不着头脑。
您要帮助电缆师傅编写一个程序，确定从库存电缆中切割出的电缆片的最大长度，以获得指定的数量。
输入
输入文件的第一行包含两个整数 N 和 K，中间用空格隔开。N（1 = N = 10000）是库存电缆的数量，K（1 = K = 10000）是要求切割的片数。
第一行之后是 N 行，每行一个数字，以米为单位指定库存中每条电缆的长度。所有电缆的长度至少为 1 米，最多为 100 千米。
输入文件中的所有长度都以厘米为精度，小数点后两位数。
输出
在输出文件中写入电缆管理器从库存电缆中剪下的最大长度（以米为单位），以获得所要求的片数。
写入的数字必须精确到厘米，小数点后精确到两位数。
如果无法剪切出所要求的每根至少一厘米长的长度，则输出文件必须包含单个数字 "0.00"（不带引号）。

4 11
8.02
7.43
4.57
5.39

2.00

*/

const int N = 10010;
double arr[N];
int n, k;

bool check(double x) {
	int sum = 0;
	for (int i = 0; i < n; i++) {
		sum += floor(arr[i] / x);
	}

	return sum <  k;
}

void solve() {
	double l = 0.0; double r = 100010.0;
	while (r - l >= 1e-5) {
		double mid = (l + r) / 2.0;
		if (check(mid)) { r = mid; }
		else l = mid;
	}
	printf("%.2f\n", floor(r * 100) / 100);
}


int main()
{
	//cin >> n >> k;
	scanf("%d%d",&n,&k);
	for (int i = 0; i < n; i++) {
		//cin >> arr[i];
		scanf("%lf",&arr[i]);
	}
	solve();


	return 0;
}

 